let fs = require('fs');
let path = require('path');
// 定义源目录和目标目录
let sourceDir = `D:\\华为家庭存储\\PrivateSpace\\ImageJSON`; // 替换为你的源目录路径
let targetDir = `D:\\360安全浏览器下载\\新建文件夹`; // 替换为目标目录路径
// 创建目标目录（如果不存在）
if (!fs.existsSync(targetDir)) {
  fs.mkdirSync(targetDir, { recursive: true });
}
/**
 * 读取目录中的所有文件
 * @param {string} dir 目录路径
 * @returns {Array<string>} 文件路径数组
 */
function readFiles(dir) {
  return fs.readdirSync(dir).map(file => path.join(dir, file));
}
function processTitle(data) {
  // 使用正则表达式匹配所有非英文字母（a-zA-Z）、非汉字（\u4e00-\u9fa5）和非数字（0-9）的字符，并将其替换为空字符串
  return data.replace(/[^\w\u4e00-\u9fa5]/g, '').replace(/_/g, '').trim();
}
/**
 * 解析JSON文件并提取base64图片数据
 * @param {string} filePath 文件路径
 * @returns {Array<{filename: string, data: string}>} 图片数据数组
 */
function extractBase64Images(filePath) {
  try {
    // 获取文件名
    let fileName = path.basename(filePath);
    // 获取目录名
    // let dirName = path.dirname(filePath);
    // 获取扩展名
    // let extName = path.extname(filePath);
    // 如果需要进一步分割目录路径
    // let dirParts = dirName.split(path.sep);
    let jsonData = JSON.parse(fs.readFileSync(filePath, 'utf8'));
    let images = [];
    if (jsonData && Array.isArray(jsonData)) {
      jsonData.forEach((image, index) => {
        image = Array.isArray(image) ? image : [String(index + 1), image];
        let str = image[0];
        // 网络图片
        if (str.startsWith('https://') || str.startsWith('http://') || str.startsWith('//')) {
          str = 'Network';
        }
        // 截图
        else if (str.startsWith('Snipaste') || str.startsWith('Screenshot') || str.startsWith('mmexport')) {
          str = 'Screenshot';
        } else {
          str = processTitle(str);
        }
        if (/^\d+$/g.test(str)) {
          images.push({
            filename: `${str}_${fileName.replace('.', '_')}_${index + 1}.png`,
            data: image[1],
          });
        }
      });
    }
    return images;
  } catch (e) {
    fs.appendFile(`D:\\360安全浏览器下载\\json.txt`, filePath + '\n', err => {});
    return [];
  }
}
/**
 * 将base64编码的图片数据保存为文件
 * @param {string} imageData base64编码的图片数据
 * @param {string} outputPath 输出文件路径
 */
function saveImage(imageData, outputPath) {
  return new Promise(resolve => {
    let base64Data = imageData.replace(/^data:image\/\w+;base64,/, '');
    let buffer = Buffer.from(base64Data, 'base64');
    fs.writeFileSync(outputPath, buffer);
    resolve();
  });
}
// 主函数
async function main() {
  let files = readFiles(sourceDir);
  for (let file of files) {
    if (path.extname(file).toLowerCase() === '.json') {
      console.log(`Processing file: ${file}`);
      let images = extractBase64Images(file);
      if (images.length) {
        let list = [];
        for (let image of images) {
          let outputPath = path.join(targetDir, image.filename);
          list.push(saveImage(image.data, outputPath));
        }
        await Promise.all(list);
      }
    }
  }
  console.log('All images have been saved.');
}
main();
